package src.edu.uniquindio.controlador;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import src.edu.uniquindio.dao.DaoDocente;
import src.edu.uniquindio.dao.DaoEstudiante;
import src.edu.uniquindio.dao.DaoEvaluacion;
import src.edu.uniquindio.dao.DaoFigura;
import src.edu.uniquindio.mundo.Docente;
import src.edu.uniquindio.mundo.Estudiante;
import src.edu.uniquindio.mundo.Evaluacion;
import src.edu.uniquindio.mundo.Figura;

public class ModuloManejo {

	ArrayList<Docente> docentes;
	List<Evaluacion> evaluaciones;
	List<Figura> figuras;
	Connection conexion;
	public static final String NOMBRE_BD = "desarrolo_cognitivo.mdb";

	public ModuloManejo() throws SQLException {
		docentes = new ArrayList<Docente>();
		evaluaciones = new ArrayList<Evaluacion>();
		figuras = new ArrayList<Figura>();
		conexion = DriverManager.getConnection(
				"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="
						+ NOMBRE_BD, "Administrador", "12345");
	}

	/********************************************************************
	 * metodo para conectarse a la BD.
	 * 
	 * @param user
	 *            nombre de usuario de la BD
	 * @param pass
	 *            password de la BD
	 * @param ip
	 *            direccion IP del servidor de BD.
	 * @throws Exception
	 */
	// public void conectarse(String user, String pass, String ip) throws
	// Exception {
	// Class.forName("com.mysql.jdbc.Driver");
	// conexion = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" +
	// NOMBRE_BD, user, pass);
	// }

	public boolean crearDocente( String cedula, String nombre,
			String direccion, String telefono, String apellido1,
			String apellido2) {
		DaoDocente daoDocen = new DaoDocente(conexion);
		if (daoDocen.crearDocente( cedula, nombre, direccion, telefono,
				apellido1, apellido2)) {
			Docente doc = new Docente(cedula, nombre, direccion,
					telefono, apellido1, apellido2);
			docentes.add(doc);
			return true;
		}
		return false;

	}
	public boolean buscarEstudiante(String codigo) {
		DaoEstudiante dao=new DaoEstudiante(conexion);
		Estudiante est = null;
		try {
			 est=dao.buscar(codigo);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (est==null) {
			return true;
		}return false;
	}

	public void crearEstudiante(String codigo, int edad, String nombre,
			String direccion, String docente, String apellido1, String apellido2,String foto) {
		DaoEstudiante daoEstudiante = new DaoEstudiante(conexion);
		daoEstudiante.crearEstudiante(codigo, edad, nombre, direccion, docente,
				apellido1, apellido2);
		Estudiante es = new Estudiante(codigo, edad, nombre, direccion, null,
				apellido1, apellido2,foto);

		// asignamos el docente
		asignarElDocente(docente, es);

	}

	public boolean crearEstudiante(Estudiante estudiante) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		try {
			return dao.crear(estudiante);
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"El codigo ingresado ya esta asignado" );
			return false;
		}
		
	}

	public Estudiante buscarEstudiante(String docente, String codigo) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		try {
			return dao.buscar(docente, codigo);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public Docente asignarElDocente(String cedDocente, Estudiante es) {

		for (int i = 0; i < docentes.size(); i++) {

			if (docentes.get(i).getCedula().equals(cedDocente)) {

				docentes.get(i).getEstudiantes().add(es);
				return docentes.get(i);
			}

		}

		return null;

	}

	public void crearEvaluacion(Evaluacion evaluacion) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		dao.crearEvaluacion(evaluacion);
	}

	public Docente buscarElDocente(String docente) {

		for (int i = 0; i < docentes.size(); i++) {

			if (docentes.get(i).getCedula().equals(docente)) {

				return docentes.get(i);
			}

		}

		return null;

	}

	public void editarDocente(Docente docente) {
		DaoDocente dao = new DaoDocente(conexion);
		try {
			dao.editar(docente);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void listarDocentes() {

		try {

			PreparedStatement pstmt = conexion
					.prepareStatement("select cedula,nombre,direccion,telefono,apellido1,apellido2 from Docente");

			ResultSet res = pstmt.executeQuery();

			while (res.next()) {

				String cedula = res.getString(1);
				String nombre = res.getString(2);
				String direccion = res.getString(3);
				String telefono = res.getString(4);
				String apellido1 = res.getString(5);
				String apellido2 = res.getString(6);

				Docente docente = new Docente(cedula, nombre,
						direccion, telefono, apellido1, apellido2);
				docentes.add(docente);
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public boolean EditarEstudiante(Estudiante estudiante) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		try {
			return dao.editar(estudiante);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	
	public void editarFoto(String foto,String codigo) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		try {
			 dao.editarFotoEstudiante(foto, codigo);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public List<Estudiante> listarEstudiantesCodigo(String codigoDocente,String cod,int edad) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		return dao.listarEstudiantesCodigo(codigoDocente, cod,edad);
	}
	public List<Estudiante> listarEstudiantesnombreApellido(String codigoDocente,String nombre, 
			String apellido,int edad) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		return dao.listarEstudiantesNombreApell(codigoDocente, nombre, apellido,edad);
	}
	public List<Estudiante> listarEstudiantesnombre(String codigoDocente,String nombre,int edad) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		return dao.listarEstudiantesNombre(codigoDocente, nombre,edad);
	}
	public List<Estudiante> listarEstudiantesPrimerApellido(String codigoDocente,String apellido,int edad) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		return dao.listarEstudiantesPrimerApell(codigoDocente, apellido,edad);
	}

	public List<Estudiante> listarEstudiantes(String codigoDocente) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		return dao.listarEstudiantes(codigoDocente);
	}

	public ArrayList<Figura> cargarEvaluacion(int id) {

		ArrayList<Figura> figuras;
		DaoFigura daoFig = new DaoFigura(conexion);
		figuras = daoFig.listarFigurasPorIdEvaluacion(id);
		return figuras;
	}

	public List<Estudiante> listarEstudiantesEdad(String codigoDocente, int edad) {
		DaoEstudiante dao = new DaoEstudiante(conexion);
		return dao.listarEstudiantes(codigoDocente, edad);
	}

	// Todos los campos
	public List<Evaluacion> evaluacionesTodosLosCampos(String categoria,
			String fecha, String nombre, String docente,int edad) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCategoriaFechaCodigo(categoria, fecha, nombre,
				docente, edad);
	}

	// fecha codigo
	public List<Evaluacion> evaluacionesFechaCodigo(String fecha,
			String codigo, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesFechaCodigo(fecha, codigo, docente);
	}

	// codigo categoria
	public List<Evaluacion> evaluacionesCategoriaCodigo(String categoria,
			String codigo, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCategoriaCodigo(categoria, codigo, docente);
	}

	// categoria fecha edad

	public List<Evaluacion> evaluacionesCategoriaFechaEdad(String categoria,
			String fecha, int edad, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCategoriaFechaEdad(categoria, fecha, edad,
				docente);
	}

	// categoria fecha
	public List<Evaluacion> evaluacionesCategoriaFecha(String categoria,
			String fecha, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCategoriaFecha(categoria, fecha, docente);
	}

	// fecha edad

	public List<Evaluacion> evaluacionesFechaEdad(String fecha, int edad,
			String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesFechaEdad(fecha, edad, docente);
	}

	// codigo edad
	public List<Evaluacion> evaluacionesCodigoEdad(String codigo, int edad,
			String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCodigoEdad(codigo, edad, docente);
	}

	// codigo edad categoria
	public List<Evaluacion> evaluacionesCodigoCategoriaEdad(String categoria,
			String codigo, int edad, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCategoriaEdadCodigo(categoria, codigo, edad,
				docente);
	}

	// edad categoria
	public List<Evaluacion> evaluacionesCategoriaEdad(String categoria,
			int edad, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesEdadCategoria(edad, categoria, docente);
	}

	// solo edad
	public List<Evaluacion> evaluacionesEdad(int edad, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesEdad(edad, docente);
	}

	// solo codigo

	public List<Evaluacion> evaluacionesCodigo(String codigo, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCodigo(codigo, docente);
	}

	// solo fecha
	public List<Evaluacion> evaluacionesFecha(String fecha, String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesFecha(fecha, docente);
	}

	// solo categoria
	public List<Evaluacion> evaluacionesCategoria(String categoria,
			String docente) {
		DaoEvaluacion dao = new DaoEvaluacion(conexion);
		return dao.evaluacionesCategoria(categoria, docente);
	}

	public ArrayList<Docente> getDocentes() {
		return docentes;
	}

	public void setDocentes(ArrayList<Docente> docentes) {
		this.docentes = docentes;
	}

	public List<Evaluacion> getEvaluaciones() {
		return evaluaciones;
	}

	public void setEvaluaciones(List<Evaluacion> evaluaciones) {
		this.evaluaciones = evaluaciones;
	}

	public List<Figura> getFiguras() {
		return figuras;
	}

	public void setFiguras(List<Figura> figuras) {
		this.figuras = figuras;
	}

	public Connection getConexion() {
		return conexion;
	}

	public void setConexion(Connection conexion) {
		this.conexion = conexion;
	}

	public static String getNombreBd() {
		return NOMBRE_BD;
	}

}
